<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- qclevent.cpp -->
  <title>QCLEvent Class Reference</title>
  <link rel="stylesheet" type="text/css" href="style/style.css" />
  <script src="scripts/jquery.js" type="text/javascript"></script>
  <script src="scripts/functions.js" type="text/javascript"></script>
  <script src="./scripts/superfish.js" type="text/javascript"></script>
  <link rel="stylesheet" type="text/css" href="style/superfish.css" />  <script src="./scripts/narrow.js" type="text/javascript"></script>
  <link rel="stylesheet" type="text/css" href="style/narrow.css" />
  <!--[if IE]>
<meta name="MSSmartTagsPreventParsing" content="true">
<meta http-equiv="imagetoolbar" content="no">
<![endif]-->
<!--[if lt IE 7]>
<link rel="stylesheet" type="text/css" href="style/style_ie6.css">
<![endif]-->
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="style/style_ie7.css">
<![endif]-->
<!--[if IE 8]>
<link rel="stylesheet" type="text/css" href="style/style_ie8.css">
<![endif]-->
</head>
<body class="" onload="CheckEmptyAndLoadList();">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="left" valign="top" width="150"><img src="images/qt-logo.png" align="left" border="0" />&nbsp;&nbsp;<img src="images/qtopencl-logo.png" border="0" /></td>
<td width="1">&nbsp;&nbsp;</td><td class="postheader" valign="center"> <a href="index.html"><font color="#004faf">Home</font></a>&nbsp;&middot; <a href="qtopencl-all-classes.html"><font color="#004faf">All Classes</font></a></td>
</table>              <li><a href="modules.html">Modules</a></li>              <li>QtCL</li>
              <li>QCLEvent</li>
<div class="toc">
<h3><a name="toc">Contents</a></h3>
<ul>
<li class="level1"><a href="#public-functions">Public Functions</a></li>
<li class="level1"><a href="#details">Detailed Description</a></li>
</ul>
</div>
<h1 class="title">QCLEvent Class Reference</h1>
<!-- $$$QCLEvent-brief -->
<p>The QCLEvent class represents an OpenCL event object. <a href="#details">More...</a></p>
<!-- @@@QCLEvent -->
<pre class="highlightedCode brush: cpp">    #include &lt;QCLEvent&gt;</pre><p>Inherited by <a href="qcluserevent.html">QCLUserEvent</a>.</p>
<p>This class was introduced in QtOpenCL 4.7.</p>
<ul>
<li><a href="qclevent-members.html">List of all members, including inherited members</a></li>
</ul>
<a name="public-functions"></a>
<h2>Public Functions</h2>
<table class="alignedsummary">
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#QCLEvent">QCLEvent</a></b> ()</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#QCLEvent-2">QCLEvent</a></b> ( cl_event <i>id</i> )</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#QCLEvent-3">QCLEvent</a></b> ( const QCLEvent &amp; <i>other</i> )</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#dtor.QCLEvent">~QCLEvent</a></b> ()</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> cl_command_type </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#commandType">commandType</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> cl_event </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#eventId">eventId</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> quint64 </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#finishTime">finishTime</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isErrored">isErrored</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isFinished">isFinished</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isNull">isNull</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isQueued">isQueued</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isRunning">isRunning</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#isSubmitted">isSubmitted</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> quint64 </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#queueTime">queueTime</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> quint64 </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#runTime">runTime</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> cl_int </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#status">status</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> quint64 </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#submitTime">submitTime</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> QFuture&lt;void&gt; </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#toFuture">toFuture</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> void </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#waitForFinished">waitForFinished</a></b> ()</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#operator-QFuture-ltvoid-gt">operator QFuture&lt;void&gt;</a></b> () const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#operator-not-eq">operator!=</a></b> ( const QCLEvent &amp; <i>other</i> ) const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> QCLEvent &amp; </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#operator-eq">operator=</a></b> ( const QCLEvent &amp; <i>other</i> )</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> bool </td><td class="memItemRight bottomAlign"><b><a href="qclevent.html#operator-eq-eq">operator==</a></b> ( const QCLEvent &amp; <i>other</i> ) const</td></tr>
</table>
<a name="details"></a>
<!-- $$$QCLEvent-description -->
<div class="descr">
<h2>Detailed Description</h2>
<p>The QCLEvent class represents an OpenCL event object.</p>
<p>QCLEvent objects are used to track the current status of an asynchronous command that was executed against a <a href="qclcontext.html">QCLContext</a>. Events progress through a number of states:</p>
<table class="generic">
<tr class="odd topAlign"><td ><p><a href="qclevent.html#isQueued">isQueued</a>()</p></td><td ><p>The command has been enqueued on the command queue for the <a href="qclcontext.html">QCLContext</a> but has not yet been submitted to the OpenCL device for execution.</p></td></tr>
<tr class="even topAlign"><td ><p><a href="qclevent.html#isSubmitted">isSubmitted</a>()</p></td><td ><p>The command has been submitted to the OpenCL device for execution, but has not started executing.</p></td></tr>
<tr class="odd topAlign"><td ><p><a href="qclevent.html#isRunning">isRunning</a>()</p></td><td ><p>The command is running on the OpenCL device, but has not yet finished.</p></td></tr>
<tr class="even topAlign"><td ><p><a href="qclevent.html#isFinished">isFinished</a>()</p></td><td ><p>The command has finished execution and the results, if any, are now available for use in further commands.</p></td></tr>
<tr class="odd topAlign"><td ><p><a href="qclevent.html#isErrored">isErrored</a>()</p></td><td ><p>The command has finished execution due to an error.</p></td></tr>
</table>
<p>Host applications can wait for the event (and thus, the command that created it) to finish by calling <a href="qclevent.html#waitForFinished">waitForFinished</a>():</p>
<pre class="highlightedCode brush: cpp">    QCLBuffer buffer = ...;
    QCLEvent event = buffer.readAsync(offset, data, size);
    ...
    event.waitForFinished();</pre>
<p>Applications can also pass a <a href="qcleventlist.html">QCLEventList</a> of event objects to another command to tell it to start executing only once all events in the list have finished:</p>
<pre class="highlightedCode brush: cpp">    QCLBuffer buffer = ...;
    QCLEvent event1 = buffer.readAsync(offset1, data1, size1);
    QCLEvent event2 = buffer.readAsync(offset2, data2, size2);

    QCLEventList after;
    after &lt;&lt; event1 &lt;&lt; event2;
    QCLEvent event3 = buffer.readAsync(offset3, data3, size3, after);
    ...
    event3.waitForFinished();</pre>
<p>Normally it isn't necessary to wait for previous requests to finish because the command queue's natural order will enforce the conditions. If however <a href="qclcommandqueue.html#isOutOfOrder">QCLCommandQueue::isOutOfOrder</a>() is set, it is possible for the second and third <a href="qclbuffer.html#readAsync">QCLBuffer::readAsync</a>() commands above to start before the first command has finished. Event lists can be used to order commands when out-of-order command execution is in use.</p>
</div>
<p>See also <a href="qclcommandqueue.html#isOutOfOrder">QCLCommandQueue::isOutOfOrder</a>(), <a href="qcleventlist.html">QCLEventList</a>, and <a href="qcluserevent.html">QCLUserEvent</a>.</p>
<!-- @@@QCLEvent -->
<div class="func">
<h2>Member Function Documentation</h2>
<!-- $$$QCLEvent[overload1]$$$QCLEvent -->
<h3 class="fn"><a name="QCLEvent"></a>QCLEvent::QCLEvent ()</h3>
<p>Constructs a null OpenCL event object.</p>
<!-- @@@QCLEvent -->
<!-- $$$QCLEvent$$$QCLEventcl_event -->
<h3 class="fn"><a name="QCLEvent-2"></a>QCLEvent::QCLEvent ( cl_event <i>id</i> )</h3>
<p>Constructs an OpenCL event object from the native identifier <i>id</i>. This class takes over ownership of <i>id</i> and will release it in the destructor.</p>
<!-- @@@QCLEvent -->
<!-- $$$QCLEvent$$$QCLEventconstQCLEvent& -->
<h3 class="fn"><a name="QCLEvent-3"></a>QCLEvent::QCLEvent ( const QCLEvent &amp; <i>other</i> )</h3>
<p>Constructs a copy of <i>other</i>. The <tt>clRetainEvent()</tt> function will be called to update the reference count on <a href="qclevent.html#eventId">eventId</a>().</p>
<!-- @@@QCLEvent -->
<!-- $$$~QCLEvent[overload1]$$$~QCLEvent -->
<h3 class="fn"><a name="dtor.QCLEvent"></a>QCLEvent::~QCLEvent ()</h3>
<p>Releases this OpenCL event object by calling <tt>clReleaseEvent()</tt>.</p>
<!-- @@@~QCLEvent -->
<!-- $$$commandType[overload1]$$$commandType -->
<h3 class="fn"><a name="commandType"></a>cl_command_type QCLEvent::commandType () const</h3>
<p>Returns the type of command that generated this event.</p>
<!-- @@@commandType -->
<!-- $$$eventId[overload1]$$$eventId -->
<h3 class="fn"><a name="eventId"></a>cl_event QCLEvent::eventId () const</h3>
<p>Returns the native OpenCL identifier for this event.</p>
<!-- @@@eventId -->
<!-- $$$finishTime[overload1]$$$finishTime -->
<h3 class="fn"><a name="finishTime"></a>quint64 QCLEvent::finishTime () const</h3>
<p>Returns the device time in nanoseconds when the command finished running on the device.</p>
<p>The return value is only valid if the command has finished execution and profiling was enabled on the command queue.</p>
<p>See also <a href="qclevent.html#queueTime">queueTime</a>(), <a href="qclevent.html#submitTime">submitTime</a>(), <a href="qclevent.html#runTime">runTime</a>(), and <a href="qclevent.html#isFinished">isFinished</a>().</p>
<!-- @@@finishTime -->
<!-- $$$isErrored[overload1]$$$isErrored -->
<h3 class="fn"><a name="isErrored"></a>bool QCLEvent::isErrored () const</h3>
<p>Returns true if an error has occurred on this OpenCL event.</p>
<p>See also <a href="qclevent.html#isQueued">isQueued</a>(), <a href="qclevent.html#isSubmitted">isSubmitted</a>(), <a href="qclevent.html#isRunning">isRunning</a>(), <a href="qclevent.html#isFinished">isFinished</a>(), and <a href="qclevent.html#status">status</a>().</p>
<!-- @@@isErrored -->
<!-- $$$isFinished[overload1]$$$isFinished -->
<h3 class="fn"><a name="isFinished"></a>bool QCLEvent::isFinished () const</h3>
<p>Returns true if the command associated with this OpenCL event has finished execution on the device.</p>
<p>See also <a href="qclevent.html#isQueued">isQueued</a>(), <a href="qclevent.html#isSubmitted">isSubmitted</a>(), <a href="qclevent.html#isRunning">isRunning</a>(), <a href="qclevent.html#isErrored">isErrored</a>(), and <a href="qclevent.html#status">status</a>().</p>
<!-- @@@isFinished -->
<!-- $$$isNull[overload1]$$$isNull -->
<h3 class="fn"><a name="isNull"></a>bool QCLEvent::isNull () const</h3>
<p>Returns true if this OpenCL event object is null; false otherwise.</p>
<!-- @@@isNull -->
<!-- $$$isQueued[overload1]$$$isQueued -->
<h3 class="fn"><a name="isQueued"></a>bool QCLEvent::isQueued () const</h3>
<p>Returns true if the command associated with this OpenCL event has been queued for execution on the host, but has not yet been submitted to the device yet.</p>
<p>See also <a href="qclevent.html#isSubmitted">isSubmitted</a>(), <a href="qclevent.html#isRunning">isRunning</a>(), <a href="qclevent.html#isFinished">isFinished</a>(), <a href="qclevent.html#isErrored">isErrored</a>(), and <a href="qclevent.html#status">status</a>().</p>
<!-- @@@isQueued -->
<!-- $$$isRunning[overload1]$$$isRunning -->
<h3 class="fn"><a name="isRunning"></a>bool QCLEvent::isRunning () const</h3>
<p>Returns true if the command associated with this OpenCL event is running on the device, but has not yet finished.</p>
<p>See also <a href="qclevent.html#isQueued">isQueued</a>(), <a href="qclevent.html#isSubmitted">isSubmitted</a>(), <a href="qclevent.html#isFinished">isFinished</a>(), <a href="qclevent.html#isErrored">isErrored</a>(), and <a href="qclevent.html#status">status</a>().</p>
<!-- @@@isRunning -->
<!-- $$$isSubmitted[overload1]$$$isSubmitted -->
<h3 class="fn"><a name="isSubmitted"></a>bool QCLEvent::isSubmitted () const</h3>
<p>Returns true if the command associated with this OpenCL event has been submitted for execution on the device yet, but is not yet running.</p>
<p>See also <a href="qclevent.html#isQueued">isQueued</a>(), <a href="qclevent.html#isRunning">isRunning</a>(), <a href="qclevent.html#isFinished">isFinished</a>(), <a href="qclevent.html#isErrored">isErrored</a>(), and <a href="qclevent.html#status">status</a>().</p>
<!-- @@@isSubmitted -->
<!-- $$$queueTime[overload1]$$$queueTime -->
<h3 class="fn"><a name="queueTime"></a>quint64 QCLEvent::queueTime () const</h3>
<p>Returns the device time in nanoseconds when the command was queued for execution on the host.</p>
<p>The return value is only valid if the command has finished execution and profiling was enabled on the command queue.</p>
<p>See also <a href="qclevent.html#submitTime">submitTime</a>(), <a href="qclevent.html#runTime">runTime</a>(), <a href="qclevent.html#finishTime">finishTime</a>(), and <a href="qclevent.html#isQueued">isQueued</a>().</p>
<!-- @@@queueTime -->
<!-- $$$runTime[overload1]$$$runTime -->
<h3 class="fn"><a name="runTime"></a>quint64 QCLEvent::runTime () const</h3>
<p>Returns the device time in nanoseconds when the command started running on the device.</p>
<p>The return value is only valid if the command has finished execution and profiling was enabled on the command queue.</p>
<p>See also <a href="qclevent.html#queueTime">queueTime</a>(), <a href="qclevent.html#submitTime">submitTime</a>(), <a href="qclevent.html#finishTime">finishTime</a>(), and <a href="qclevent.html#isRunning">isRunning</a>().</p>
<!-- @@@runTime -->
<!-- $$$status[overload1]$$$status -->
<h3 class="fn"><a name="status"></a>cl_int QCLEvent::status () const</h3>
<p>Returns the status of this event, which is an error code or one of <tt>CL_QUEUED</tt>, <tt>CL_SUBMITTED</tt>, <tt>CL_RUNNING</tt>, or <tt>CL_COMPLETE</tt>.</p>
<p>See also <a href="qclevent.html#isQueued">isQueued</a>(), <a href="qclevent.html#isSubmitted">isSubmitted</a>(), <a href="qclevent.html#isRunning">isRunning</a>(), <a href="qclevent.html#isFinished">isFinished</a>(), and <a href="qclevent.html#isErrored">isErrored</a>().</p>
<!-- @@@status -->
<!-- $$$submitTime[overload1]$$$submitTime -->
<h3 class="fn"><a name="submitTime"></a>quint64 QCLEvent::submitTime () const</h3>
<p>Returns the device time in nanoseconds when the command was submitted by the host for execution on the device.</p>
<p>The return value is only valid if the command has finished execution and profiling was enabled on the command queue.</p>
<p>See also <a href="qclevent.html#queueTime">queueTime</a>(), <a href="qclevent.html#runTime">runTime</a>(), <a href="qclevent.html#finishTime">finishTime</a>(), and <a href="qclevent.html#isSubmitted">isSubmitted</a>().</p>
<!-- @@@submitTime -->
<!-- $$$toFuture[overload1]$$$toFuture -->
<h3 class="fn"><a name="toFuture"></a>QFuture&lt;void&gt; QCLEvent::toFuture () const</h3>
<p>Returns a QFuture object that can be used to track when this OpenCL event finishes.</p>
<p>This function creates a thread on the host CPU to monitor the event in the background. If the caller wants to block in the foreground thread, then <a href="qclevent.html#waitForFinished">waitForFinished</a>() is recommended instead of using toFuture(), because <a href="qclevent.html#waitForFinished">waitForFinished</a>() does not need to create an extra thread on the host CPU.</p>
<p>If however the caller wants to receive notification of the event finishing via a signal, then toFuture() can be used with QFutureWatcher to receive the signal:</p>
<pre class="highlightedCode brush: cpp">    QCLEvent event = ...;
    QFutureWatcher&lt;void&gt; *watcher = new QFutureWatcher&lt;void&gt;(this);
    watcher-&gt;setFuture(event.toFuture());
    connect(watcher, SIGNAL(finished()), this, SLOT(eventFinished()));</pre>
<p><a href="qclevent.html">QCLEvent</a> has an implicit conversion operator to QFuture&lt;void&gt;, which allows the QFutureWatcher::setFuture() call to be shortened as follows:</p>
<pre class="highlightedCode brush: cpp">    watcher-&gt;setFuture(event);</pre>
<p>It is also possible to execute a <a href="qclkernel.html">QCLKernel</a> with <a href="qtconcurrent.html#run">QtConcurrent::run</a>() and receive notification of the result via QFuture:</p>
<pre class="highlightedCode brush: cpp">    QFuture&lt;void&gt; future = QtConcurrent::run(kernel, a1, b1);
    future.waitForFinished();</pre>
<p>See also <a href="qclkernel.html#kernels-and-qtconcurrent">Kernels and QtConcurrent</a>.</p>
<!-- @@@toFuture -->
<!-- $$$waitForFinished[overload1]$$$waitForFinished -->
<h3 class="fn"><a name="waitForFinished"></a>void QCLEvent::waitForFinished ()</h3>
<p>Waits for this event to be signalled as finished. The calling thread is blocked until the event is signalled. This function returns immediately if the event is null.</p>
<p>See also <a href="qclevent.html#isFinished">isFinished</a>() and <a href="qcleventlist.html#waitForFinished">QCLEventList::waitForFinished</a>().</p>
<!-- @@@waitForFinished -->
<!-- $$$operator QFuture<void>[overload1]$$$operator QFuture<void> -->
<h3 class="fn"><a name="operator-QFuture-ltvoid-gt"></a>QCLEvent::operator QFuture&lt;void&gt; () const</h3>
<p>Equivalent to calling <a href="qclevent.html#toFuture">toFuture</a>().</p>
<p>This conversion operator is intended to help with interfacing OpenCL to code that uses QtConcurrent.</p>
<!-- @@@operator QFuture<void> -->
<!-- $$$operator!=[overload1]$$$operator!=constQCLEvent& -->
<h3 class="fn"><a name="operator-not-eq"></a>bool QCLEvent::operator!= ( const QCLEvent &amp; <i>other</i> ) const</h3>
<p>Returns true if this OpenCL event is not the same as <i>other</i>; false otherwise.</p>
<p>See also <a href="qclevent.html#operator-eq-eq">operator==</a>().</p>
<!-- @@@operator!= -->
<!-- $$$operator=[overload1]$$$operator=constQCLEvent& -->
<h3 class="fn"><a name="operator-eq"></a>QCLEvent &amp; QCLEvent::operator= ( const QCLEvent &amp; <i>other</i> )</h3>
<p>Assigns <i>other</i> to this OpenCL event object. The current <a href="qclevent.html#eventId">eventId</a>() will be released with <tt>clReleaseEvent()</tt>, and the new <a href="qclevent.html#eventId">eventId</a>() will be retained with <tt>clRetainEvent()</tt>.</p>
<!-- @@@operator= -->
<!-- $$$operator==[overload1]$$$operator==constQCLEvent& -->
<h3 class="fn"><a name="operator-eq-eq"></a>bool QCLEvent::operator== ( const QCLEvent &amp; <i>other</i> ) const</h3>
<p>Returns true if this OpenCL event is the same as <i>other</i>; false otherwise.</p>
<p>See also <a href="qclevent.html#operator-not-eq">operator!=</a>().</p>
<!-- @@@operator== -->
</div>
<p /><address><hr /><div align="center">
<table width="100%" cellspacing="0" border="0"><tr class="address">
<td align="left">Copyright &copy; 2010 Nokia Corporation</td>
<td align="right">QtOpenCL Documentation</td>
</tr></table></div></address>  <script src="scripts/functions.js" type="text/javascript"></script>
  <script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-4457116-5']);
  _gaq.push(['_trackPageview']);
  (function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
  </script>
</body>
</html>
